package com.projetosi.web.server.sistema.objetos;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.projetosi.web.server.sistema.interfaces.IGenericObject;
import com.projetosi.web.server.sistema.util.Data;
import com.projetosi.web.server.sistema.util.Validador;

/**
 * 
 * @author  Filipe Alencar, Felipe Jos� F. Cavalcanti, Rodrigo L. de Brito, Thiago Gon�alves, Victor Hugo Arcelino.
 *
 */
public class Item implements IGenericObject,Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -504722882176500754L;

	public enum TipoDeItem{
		LIVRO, FILME, JOGO;
	}
	
	public enum StatusItem{
		DISPONIVEL, EMPRESTADO;
	}
	
	private Usuario dono;
	private String nome;
	private String descricao;
	private TipoDeItem categoria;
	private List<String> categoriasSecundarias = new ArrayList<String>();;
	private StatusItem status = StatusItem.DISPONIVEL;
	private int idItem;
	private Data dataDeCriacao;
	
	private List<Usuario> usuariosInteressados = new ArrayList<Usuario>();
	/**
	 * Construtor de item
	 * @param dono - Usuario dono do item
	 * @param nome - Nome do item
	 * @param descricao - Descri��o do item
	 * @param categoria - Categoria do item
	 * @param idItem - Id do item
	 * @throws Exception 
	 */
	public Item(Usuario dono, String nome, String descricao, String categoria, int idItem) throws Exception{
		if(!(Validador.validarString(nome)))
			throw new Exception("Nome inválido");
		if(!(Validador.validarString(categoria)))
			throw new Exception("Categoria inválida");
		String[] categorias = categoria.split(", ");
		TipoDeItem categoriaReal = getCategoriaFromName(categorias[0]);
		if(!(categoriaReal instanceof TipoDeItem)) /* Nao existe a categoria */
			throw new Exception("Categoria inexistente");
		setDono(dono);
		setNome(nome);
		setDescricao(descricao);
		setCategoria(categoriaReal);
		if (categorias.length > 1){
			for (int i = 1 ; i < categorias.length ; i++)
				categoriasSecundarias.add(categorias[i]);
		}
		setId(idItem);
		setDataDeCriacao(new Data());
	}
	
	/**
	 * Metodo que define o id do item
	 * @param idItem - O id do item
	 */
	public void setId(int idItem){
		this.idItem = idItem;
	}
	
	/**
	 * Metodo que define quem � dono do item
	 * @param dono - O usuario a qual pertence o item
	 */
	public void setDono(Usuario dono){
		this.dono = dono;
	}
	
	/**
	 * Metodo que define qual a categoria do item
	 * @param categoria - A categoria do item
	 */
	public void setCategoria(TipoDeItem categoria) {
		this.categoria = categoria;
	}
	
	/**
	 * Metodo que define o nome do item
	 * @param nome - Nome do item
	 */
	public void setNome(String nome){
		this.nome = nome;
	}
	
	/**
	 * Metodo que define a descri��o do item
	 * @param descricao - Descri��o do item
	 */
	public void setDescricao(String descricao){
		this.descricao = descricao;
	}
	
	/**
	 * Metodo que define o status atual do item
	 * @param status - Status do item
	 */
	public void setStatusItem(StatusItem status){
		this.status = status;
	}
	
	/**
	 * Metodo que adiciona usuarios que estejam interessados no item
	 * @param usuario - Usuario interessado
	 */
	public void setAdicionarUsuarioInteressado(Usuario usuario){
		this.usuariosInteressados.add(usuario);
	}
	
	/**
	 * Metodo que retorna o dono do item
	 * @return Dono do item
	 */
	public Usuario getDono(){
		return this.dono;
	}
	
	/**
	 * Metodo que retorna o nome do item
	 * @return Nome do item
	 */
	public String getNome(){
		return this.nome;
	}
	
	/**
	 * Metodo que retorna a descri��o do item
	 * @return Descri��o do item
	 */
	public String getDescricao(){
		return this.descricao;
	}
	
	/**
	 * Metodo que retorna o tipo do item
	 * @return Tipo do item
	 */
	public TipoDeItem getTipoDeItem(){
		return this.categoria;
	}
	
	/**
	 * Metodo que retorna o status atual do item
	 * @return Status do item
	 */
	public StatusItem getStatusDeItem(){
		return this.status;
	}
	
	/**
	 * Metodo que retorna o id do item
	 * @return - O id do item.
	 */
	public int getId(){
		return this.idItem;
	}
	
	/**
	 * Metodo que retorna a lista de usuarios interessados no item
	 * @return Lista de usuarios interessados no item
	 */
	public List<Usuario> getListaDeUsuariosInteressados(){
		return usuariosInteressados;
	}

	/**
	 * Retorna a categoria do item a partir de uma string válida que represente a categoria,
	 * @param categoria A string que representa um tipo de categoria de item.
	 * @return O tipo de categoria do item.
	 */
	private TipoDeItem getCategoriaFromName(String categoria){
		if (categoria.equalsIgnoreCase("Filme"))
			return TipoDeItem.FILME;
		else if (categoria.equalsIgnoreCase("Livro"))
			return TipoDeItem.LIVRO;
		else if (categoria.equalsIgnoreCase("Jogo"))
			return TipoDeItem.JOGO;
		else
			return null; //Ja verifica se nao existe a categoria.
	}
	
	
	/**
	 * Retorna a Lista de categorias secundárias do item.
	 * @return List
	 */
	public List<String> getCategoriasSecundarias(){
		return categoriasSecundarias;
	}
	
	/**
	 * Retorna a categoria a partir de um string que represente a categoria.
	 * @param categoria A categoria do item
	 * @return String que representa a categoria do item.
	 */
	public String getNameCategoriaFromCategoria(TipoDeItem categoria){
		switch (categoria) {
		case FILME:
			return "Filme";
		case LIVRO:
			return "Livro";
		case JOGO:
			return "Jogo";
		default:
			return null;
		}
		
		
	}
	
	/**
	 * Retorna a data de criacao do item.
	 * @return Um objeto Data, que representa a data de criacao do item.
	 */
	public Data getDataDeCriacao() {
		return dataDeCriacao;
	}

	/**
	 * Altera a data de criacao do item.
	 * @param dataDeCriacao A data de criacao do item.
	 */
	public void setDataDeCriacao(Data dataDeCriacao) {
		this.dataDeCriacao = dataDeCriacao;
	}
	
}
